package fiuba.algo3.algothief.modelo;

import java.io.IOException;
import java.util.ArrayList;
import java.util.Collections;


import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.TransformerException;

import org.xml.sax.SAXException;

public class Caso {
	
	private Tiempo tiempo;
	private Policia policia;
	private Ladron ladron;
	private OrdenDeArresto ordenDeArresto;

	public Caso(Policia unPolicia){
		this.tiempo = new Tiempo(0,7);
		this.policia = unPolicia;
		this.policia.setCasoEncomendado(this);
	}

	public Caso(Policia unPolicia, Ladron unLadron) {
		this.tiempo = new Tiempo(0,7);
		this.policia = unPolicia;
		this.ladron = unLadron;
		this.policia.setCasoEncomendado(this);
	}

	public Tiempo getTiempo() {
		return this.tiempo;
	}
	
	public Policia getPolicia(){
		return this.policia;
	}
	
	public Ladron getLadron(){
		return this.ladron;
	}

	public void setOrdenDeArresto(OrdenDeArresto ordenDeArresto) {
		this.ordenDeArresto = ordenDeArresto;
	}

	public OrdenDeArresto getOrdenDeArresto() {
		return this.ordenDeArresto;
	}

	public boolean estaResuelto() {
		boolean casoResuelto = false;
		if (this.ordenDeArresto != null)
			if ((this.ordenDeArresto.getSospechoso().equals(this.ladron.getNombre())) 
					&& ((this.tiempo.getDia()!="Domingo") || ((this.tiempo.getDia() == "Domingo") && (this.tiempo.getHoras()<=17)))){
				casoResuelto = true; }
		return casoResuelto;
	}

	public void adelantarTiempo(int horas) {
		this.tiempo.adelantarHoras(horas);
	}

	public Pais elegirPaisDeInicio() throws ParserConfigurationException, TransformerException, SAXException, IOException{
		ListaPaises listaPaises = new ListaPaises();
		Pais paisDeInicio = listaPaises.seleccionarPaisAleatorio();
		ArrayList <Pais> paisesLadron = this.ladron.getPaisesAEscapar();
		for (int i=0; (i<paisesLadron.size()); i++) { 
			while (paisDeInicio.getNombre() == paisesLadron.get(i).getNombre()) {		
				paisDeInicio = listaPaises.seleccionarPaisAleatorio();
			}
		}	
		this.policia.setPaisDeOrigen(paisDeInicio);
		return paisDeInicio;
	}


	public ArrayList<Pais> elegirOpcionesAViajar() throws ParserConfigurationException, TransformerException, SAXException, IOException{
		ArrayList<Pais> opcionesAViajar = new ArrayList<Pais>();
		ListaPaises lista = new ListaPaises();
		ArrayList <Pais> listaPaises = new ArrayList <Pais>();
		lista.setearPaisesAEscapar(listaPaises);				 		
		ArrayList <Pais> paisesLadron = this.ladron.getPaisesAEscapar();
		String paisQueSeEncuentra = (this.policia.getPaisEnElQueSeEncuentra()).getNombre();
		for (int i=0; (i<listaPaises.size()); i++) {
			for (int j=0; (j<paisesLadron.size()); j++) {
				if (listaPaises.get(i).getNombre() == paisesLadron.get(j).getNombre() )
					listaPaises.remove(i);
			}
		}
		
		Collections.shuffle(listaPaises);				
		Pais paisCorrecto = this.ladron.getSiguientePais();
		Pais paisIncorrecto1 = new Pais();
		Pais paisIncorrecto2 = new Pais();
		opcionesAViajar.add(paisCorrecto);
		paisIncorrecto1 = listaPaises.get(0);
		paisIncorrecto2 = listaPaises.get(1);
		int k = 2;
		while ( (paisQueSeEncuentra == paisIncorrecto1.getNombre()) || (paisQueSeEncuentra == paisIncorrecto2.getNombre()) ) {			
			 if ( (paisQueSeEncuentra == paisIncorrecto1.getNombre()) )
				 paisIncorrecto1 = listaPaises.get(k);
			 else 
				 paisIncorrecto2 = listaPaises.get(k);
			 k++;	
		}
	
		opcionesAViajar.add(paisIncorrecto1);
		opcionesAViajar.add(paisIncorrecto2);
		Collections.shuffle(opcionesAViajar);
		return opcionesAViajar;
	}

	public void modificarSiguientePais(Pais pais) throws ParserConfigurationException, TransformerException, SAXException, IOException {
		if ((pais.getNombre() == this.ladron.getSiguientePais().getNombre()) && (this.ladron.getPosicionSiguientePais() < this.ladron.getCantidadPaisesAEscapar()))
			this.ladron.cambiarSiguientePais();
		
	}

	public ArrayList<Lugar> getLugaresFinales() {
		ArrayList<Lugar> lugares = this.ladron.getPaisEnElQueSeEncuentra().getLugares();
		ArrayList<String> finalesPosibles = new ArrayList<String>();
		finalesPosibles.add("Has recibido una herida por un cuchillo");
		finalesPosibles.add("Has recibido una herida por arma de fuego");
		for (int i=0; i<lugares.size(); i++){
			if (lugares.get(i) == ladron.getLugarEnElQueSeEncuentra()){
				if (this.estaResuelto()) {
					lugares.get(i).setAcontecimientoFinal("Has arrestado al ladron");
				} else lugares.get(i).setAcontecimientoFinal("Has encontrado al ladron pero no puedes arrestarlo por no tener bien emitida la orden de arresto");
			} else {
			lugares.get(i).setAcontecimientoFinal(this.seleccionarFinalAleatorio(finalesPosibles));
			}
		}
		return lugares;
		
	}

	public void verificarRangoPolicia() {
		switch (this.policia.getCantidadDeArrestos()) {
		case 5:
			this.policia = new Detective();
			break;
		case 10:
			this.policia = new Investigador();
			break;
		case 20:
			this.policia = new Sargento();
			break;
		default:
			break;
		}
	}

	private String seleccionarFinalAleatorio(ArrayList<String> finalesPosibles) {
		Collections.shuffle(finalesPosibles);
		return finalesPosibles.get(0);
	}

}
